﻿using System;
using System.Text.RegularExpressions;

namespace SiGeCoPre.Presupuesto_Util
{
    /// <summary>
    /// Clase para enviar mail
    /// </summary>
    class EnvioDeMail
    {
        /// <summary>
        /// Envia el mail
        /// </summary>
        /// <param name="desde">Quien envia el mail</param>
        /// <param name="para">Destinatario del mail</param>
        /// <param name="copia">Personas en copia</param>
        /// <param name="asunto">Asunto del mail</param>
        /// <param name="contenido">Contenido del mail</param>
        /// <param name="adjunto">Archivo adjunto del mail</param>
        /// <returns>Devuelve true si fue enviado correctamente o false si falló</returns>
        public static Boolean enviarMail(String desde, String para, String copia, String asunto, String contenido, String adjunto)
        {
            Boolean enviado = false;
            try
            {
                if (!verificarDatos(para, copia, contenido))
                {
                    String ruta_archivo = adjunto;
                    // crea el mail de envio usando el usuario de la persona
                    // Create the Outlook application by using inline initialization.
                    Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();

                    //Create the new message by using the simplest approach.
                    Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

                    //Add a recipient.
                    // TODO: Change the following recipient where appropriate.
                    Microsoft.Office.Interop.Outlook.Recipient oRecip = (Microsoft.Office.Interop.Outlook.Recipient)oMsg.Recipients.Add(desde);
                    oRecip.Resolve();
                    oMsg.To = para;
                    if (!copia.Trim().Equals(""))
                    {
                        oMsg.CC = copia;
                    }
                    //Set the basic properties.
                    oMsg.Subject = asunto;
                    oMsg.Body = contenido;
                    //Add an attachment.
                    Microsoft.Office.Interop.Outlook.Attachment oAttach = null;

                    if (!adjunto.Equals(""))
                    {
                        oAttach = oMsg.Attachments.Add(ruta_archivo);    
                    }
                    
                    // If you want to, display the message.
                    //oMsg.Display(true);

                    //Send the message.
                    oMsg.Save();
                    oMsg.Send();
                    //Explicitly release objects.
                    oRecip = null;
                    oAttach = null;
                    oMsg = null;
                    oApp = null;

                    enviado = true;
                    }
            }
            catch (Exception ex)
            {
                enviado = false;
                Texto.escribirLog(ex.Message);
            }

            return enviado;
        }

        /// <summary>
        /// Valida los datos del mail
        /// </summary>
        /// <param name="para">Destinatario del mail</param>
        /// <param name="copia">Personas en copia</param>
        /// <param name="contenido">Contenido del mail</param>
        /// <returns>Devuelve true si son validos o false si no</returns>
        public static Boolean verificarDatos(String para, String copia, String contenido)
        {
            //verifica los datos del mail
            Boolean verifica = false;
            string expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            try
            {
                string[] destinatarios = para.Split(';');
                string[] copias = copia.Split(';');
                if (para.Equals("") || contenido.Equals(""))
                {
                    verifica = true;
                }
                else if (destinatarios.Length != 0)
                {
                    foreach (String destinatario in destinatarios)
                    {
                        if (!Regex.IsMatch(destinatario, expresion))
                        {
                            verifica = true;
                            break;
                        }
                    }
                }

                else if (copias.Length >= 1)
                {
                    foreach (String cc in copias)
                    {
                        if (!Regex.IsMatch(cc, expresion))
                        {
                            verifica = true;
                            break;
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                verifica = true;
                Texto.escribirLog(ex.Message);
            }

            return verifica;
        }
    }
}
